/**
*	file Hero.h
*	\brief Module qui gere le hero
*	\author Ostapenco Vladimir, Gehin Maxime
*	\version 1.0
*	\date 16/12/2013
*	Ce module gere l'initialisation, la sauvegarde et tout ce qui concerne le hero
*/


#ifndef hero_h
#define hero_h

#include "Monster.h"
#include "Terrain.h"
#include "Spell.h"
#include "TableauDynamique.h"

/**
* \struct Hero
* \brief structure qui gere notre hero
*/
typedef struct{
	char * name;
	int hpmax;
	int mpmax;
	int curhp;
	int curmp;
	int level;
	unsigned int curxp;
	unsigned int xpmax;
	int power;
	int intel;
	int x;
	int y;
	enum {H_ALIVE,H_DIE,H_COMBAT} mode;
	enum {GAUCHE,HAUT,DROITE,BAS} direction;
	Monster * target;
	TableauDynamique targetlist;
	int terid;
	Spell * tabspell; /*tableau de spell*/
	int nbspell; /*nombre de spell*/
   	float cooldown;
    	int attaque; /*booleen qui enclenche l'attaque auto*/
	float speed;
}Hero;




/************************************FONCTIONS DU HERO********************************/

/**fonction qui initialise le hero*/
void herInit(Hero *);

/** fonction qui affecte à notre hero la sauvegarde située dans data/Database/SaveHero.db*/
void herInitContiue(Hero *);

/**fonction qui reecrit le fichier de sauvegarde avec des valeurs standard*/
void herInitNewGame(Hero *);

/**fonction qui sauvegarde notre hero dans le ficher*/
void herSave(Hero *);

/** fonction qui libère notre hero*/
void herFree(Hero *);

/** fonction qui renvoie les coordonées du hero*/
void herGetPos(const Hero *, int * x, int * y);



/** fonction pour faire bouger le hero vers le haut en prenant compte du terrain*/
void heroHaut (Hero *,Terrain *);

/** fonction pour faire bouger le hero vers le bas en prenant compte du terrain*/
void heroBas (Hero *,Terrain *);

/** fonction pour faire bouger le hero vers la Gauche en prenant compte du terrain*/
void heroGauche (Hero *,Terrain *);

/** fonction pour faire bouger le hero vers la droite en prenant compte du terrain*/
void heroDroite (Hero *,Terrain *);

/** fonction qui gère le gain d'xp du hero*/
void herWinXp(Hero *,unsigned int xp);

/**fonction qui augmente le level du hero: elle initialise les nouvelles stats correspondant au level et reinitialise le tableau de spell*/
void herLevelUp(Hero *);

/**fonction qui renvoie la dirrection du hero*/
int herGetDir(const Hero *);

/**fonction qui inflige des degat aux monstre*/
void herAttack(Hero *);

/**fonction qui gere les degat reçus par le hero*/
void herTakeDamage(Hero *,int);

/**fonction qui gere la perte de mana (au lancement d'un spell*/
void herUseMana(Hero *,int);

/**fonction qui gere le gain de mana*/
void herWinMana(Hero *,int);

/**fonction qui gere le gain de hp*/
void herWinHp(Hero *,int);

/**fonction qui renvoie le level du hero*/
int herGetlevel(const Hero *);

/**fonction qui renvoie le nom du hero*/
char * herGetname(const Hero *);

/** fonction qui renvoie les hp actuels du hero*/
int herGetcurhp(const Hero *);

/**fonction qui renvoie le hpmax du hero*/
int herGethpmax(const Hero *);

/*fonction qui renvoie le mana actuel du hero*/
int herGetcurmp(const Hero *);

/**fonction qui renvoie le max mana du hero*/
int herGetmpmax(const Hero *);

/**fonction qui renvoie l'xp actuel du hero*/
int herGetcurxp(const Hero *);

/**fonction qui renvoie l'xpmax du hero (dépend du level) */
int herGetxpmax(const Hero *);

/**fonction qui renvoie si le hero est en train d'attaquer ou non*/
int herGetAttack(const Hero *); 

/**renvoie l'Id du terrain sur lequel le hero se trouve*/
int herGetTerID(const Hero *);

/**fonction qui renvoie le tableau de spell du hero*/
Spell * herGetSpells(const Hero *);

/**fonction qui renvoie le nombre de spell du hero*/
int herGetNbSpells(const Hero *);

/**fonction qui renvoie le ieme spell du monstre*/
Spell * herGetSpell(const Hero *,int);

/**fonction qui renvoie l'intel du hero*/
int herGetIntel(const Hero *);

/**fonction qui renvoie le power du hero*/
int herGetPower(const Hero *);

/**fonction qui renvoie la target du hero*/
Monster * herGetTarget(const Hero *);

/**fonction qui renvoie le cooldown de l'attaque auto du hero*/
float herGetCooldown(const Hero *);

/**fonction qui renvoie le speed du hero*/
float herGetSpeed(const Hero *);

/**fonction qui decremente le cooldown de l'attaque auto du hero*/
void herSetCooldown(Hero *,float);

/**fonction qui ramene le curcooldown attaque du hero a la valeur cooldown*/
void herSetCooldownAbs(Hero *,float);

/**fonction qui renvoie le mode du hero*/
int herGetMode(const Hero *);

/**fonction qui renvoie la targetlsit du hero*/
TableauDynamique* herGetTargetList(Hero *);
 
/**fonction qui modifie la target du hero*/
void herSetTarget(Hero *,Monster *);

/**fonction qui modifie le mode du hero*/
void herSetMode(Hero *,int);

/**fonction qui debute l'attaque automatique du hero*/
void herAttackStart(Hero *);

/**fonction qui termine l'attaque automatique du hero*/
void herAttackEnd(Hero *);

/**fonction qui gere la mort du hero*/
void herDie(const Hero *);
																																																														
/**fonction qui teleporte le hero aux coordonnées et sur le terrain passé en paramettre*/
void herNewPosition(Hero *,int,int,int);

 /**fonction de regression du module hero*/
void herTestRegression();
#endif
